.TH std::experimental::not_fn 3 "2024.06.10" "http://cppreference.com" "C++ Standard Libary"
.SH NAME
std::experimental::not_fn \- std::experimental::not_fn

.SH Synopsis
   Defined in header <experimental/functional>
   template< class F>                           (library fundamentals TS v2)
   /*unspecified*/ not_fn( F&& f );

   Creates a forwarding call wrapper that returns the complement of the callable object
   it holds.

.SH Parameters

   f - the object from which the Callable object held by the wrapper is constructed

.SH Return value

   Let FD be std::decay_t<F> and fd be an lvalue of type FD constructed from
   std::forward<F>(f).

   not_fn returns a forwarding call wrapper fn of unspecified type such that fn(a1, a2,
   ..., aN) is equivalent to !INVOKE(fd, a1, ..., aN), where INVOKE is the operation
   described in Callable.

   The returned call wrapper is always MoveConstructible, and is CopyConstructible if
   FD is CopyConstructible.

   Remarks

   If fd is not Callable, or std::is_constructible<FD, F>::value is not true, the
   behavior is undefined.

.SH Exceptions

   Throws no exceptions, unless the construction of fd throws.

.SH Possible implementation

   namespace detail {
       template<class F>
       struct not_fn_t {
           F f;
           template<class... Args>
           auto operator()(Args&&... args)
               noexcept(noexcept(!std::invoke(f, std::forward<Args>(args)...)))
               -> decltype(!std::invoke(f, std::forward<Args>(args)...)) {
               return !std::invoke(f, std::forward<Args>(args)...);
           }

           // cv-qualified overload for QoI
           template<class... Args>
           auto operator()(Args&&... args) const
               noexcept(noexcept(!std::invoke(f, std::forward<Args>(args)...)))
               -> decltype(!std::invoke(f, std::forward<Args>(args)...)) {
               return !std::invoke(f, std::forward<Args>(args)...);
           }

           template<class... Args>
           auto operator()(Args&&... args) volatile
               noexcept(noexcept(!std::invoke(f, std::forward<Args>(args)...)))
               -> decltype(!std::invoke(f, std::forward<Args>(args)...)) {
               return !std::invoke(f, std::forward<Args>(args)...);
           }
           template<class... Args>
           auto operator()(Args&&... args) const volatile
               noexcept(noexcept(!std::invoke(f, std::forward<Args>(args)...)))
               -> decltype(!std::invoke(f, std::forward<Args>(args)...)) {
               return !std::invoke(f, std::forward<Args>(args)...);
           }
       };
   }

   template<class F>
   detail::not_fn_t<std::decay_t<F>> not_fn(F&& f) { return { std::forward<F>(f) }; }

.SH Notes

   not_fn is intended to replace the C++03-era negators std::not1 and std::not2.

.SH See also

   not_fn  creates a function object that returns the complement of the result of the
   \fI(C++17)\fP function object it holds
           \fI(function template)\fP
